package jtracking_client;

import java.awt.event.*;
import java.io.IOException;
import java.io.OutputStream;
import jtracking_both.*;
import java.net.*;
import java.security.Security;
import java.sql.Timestamp;
import javax.swing.*;


/**
 * Sammelt Informationen über den PC
 *
 */
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.06728B04-F655-7793-3B36-AEF7A2E47D0B]
// </editor-fold>
public class Informant {
    String raum;
    class raumGUI extends JFrame implements WindowListener
    {
        JButton ok = new JButton("OK");
        final JTextField raum1 = new JTextField();
        JLabel info = new JLabel("Bitte Raum eingeben,");
        JLabel warn = new JLabel("oder sie werden abgemeldet");
        boolean abmelden = true;
        public raumGUI()
        {
            addWindowListener(this);
            ActionListener rl = new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    raum = raum1.getText();
                    if ("".equals(raum))
                    {
                        dispose();
                        new raumGUI();
                    }
                    else
                    {
                        abmelden = false;
                        dispose();
                    }
                }
            };
            ok.addActionListener(rl);
            info.setBounds(0,0,200,20);
            warn.setBounds(0,20,200,20);
            raum1.setBounds(0,40,200,30);
            ok.setBounds(55,70,80,30);
            add(info);
            add(warn);
            add(raum1);
            add(ok);
            setLayout(null);
            
            setSize(200,140);
            setVisible(true);
        }

        public void windowOpened(WindowEvent e) {

        }

        public void windowClosing(WindowEvent e) {

                if (abmelden)
                {
                    try
                    {
                        Process process = Runtime.getRuntime().exec("shutdown -l");
                    }
                    catch (IOException b)
                    {
                    
                    }
               }
        }

        public void windowClosed(WindowEvent e) {
                
        }

        public void windowIconified(WindowEvent e) {

        }

        public void windowDeiconified(WindowEvent e) {

        }

        public void windowActivated(WindowEvent e) {

        }

        public void windowDeactivated(WindowEvent e) {

        }

    }
    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.A3AADDC2-D826-2013-BBA0-B0D62FA7F0B1]
    // </editor-fold>
    public Informant ()
    {
        new raumGUI();

        // muss hier was gemacht werden?
        //muss informant eigentlich eine instanz besitzen? macht das sinn?
    }

    /**
     * Erzeugt ein neues {@link Datenpaket} und übergibt es an {@link DatenVersender} (?oder an {@link Organisator}?)
     */
    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.B5ADF35D-021E-6757-B478-F930E179602C]
    // </editor-fold>
    public Datenpaket newDatenpaket()
    {
        //vorher prüfen, ob eine der methoden null zurückgegeben hat,
        //dann ist dieses datenpaket ungültig und darf nicht verschickt werden!
        Datenpaket datenpaket = new Datenpaket(readUsername(), readHostname(), raum, readDatum(), readIPAddress());
        if(datenpaket.getIPAddress() == null || datenpaket.getHostname() == null || datenpaket.getDatum() == null || datenpaket.getUsername() == null)
        {
            return null;
        }
        return datenpaket;

   }
    public void test()
    {


        System.out.println(readUsername() + "\n" + readHostname() + "\n" + readDatum() + "\n" + Datenpaket.ipAddressToString(readIPAddress()));
    }

    
    /**
     * Liest die IP-Adresse aus
     * @return die IP-Addresse als byte[4] Array
     */
    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.6D19FA3E-3D28-61DA-F401-B5C6BBCDD79F]
    // </editor-fold>
    private byte[] readIPAddress () {
        try
        {
            //stimmt das, um immer die neueste zu holen?
            //notwending wäre hierbei ein gang durch die Räume als test der richtigkeit der Ips und der aktualität
            Security.setProperty("networkaddress.cache.ttl","0");

            return InetAddress.getLocalHost().getAddress();
            //richtige ip-adresse abrufen, bei mir wird hier hamachi ausgegeben <-- irrelevant, einheiten haben nur einen netzadapter
            //laut http://openbook.galileocomputing.de/javainsel8/javainsel_18_005.htm#mj7db632322418848bfd23e7a6ebe98112 wird mit dieser methode gecacht
            // http://openbook.galileocomputing.de/javainsel8/javainsel_18_006.htm#mja717ce1f99025e6c23be055d3e158010 zeigt vielleicht eine lösung
        }
        catch (UnknownHostException e)
        {
            return null;
        }
    }
    

    /**
     * Liest den Hostnamen des Computers aus
     * @return den Hostnamen als String
     */
    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.477827B9-8E0D-F1A8-4501-6A02BFE6A31C]
    // </editor-fold>
    private String readHostname () {
        try
        {
            return InetAddress.getLocalHost().getHostName();
        }
        catch (Exception e)
        {
            return e.getMessage();
        }
    }

    /**
     * Liest den aktuellen Benutzernamen aus
     * @return der Benutzername als String
     */
    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.10BB56D5-281E-3CEC-3101-542A8D1A9DEB]
    // </editor-fold>
    private String readUsername () {
        return System.getProperty("user.name");
    }

    /**
     * Liest das aktuelle Datum aus
     * @return das aktuelle Datum als java.util.Date Objekt
     */
    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.E900B4A8-167E-2705-FBD0-1D5BA9614E84]
    // </editor-fold>
    private Timestamp readDatum () {
         return new Timestamp(System.currentTimeMillis());
    }


    /**
     * nur zum testen des outputs:
     */
    public static void main(String[] args)
    {
        new Informant();
    }

}
